#include<func.h>
//通过计数信号量实现生产者和消费者模型
int main()
{
    int sem_id=semget(1000,2,IPC_CREAT|0600);//创建一个信号量集合
    ERROR_CHECK(sem_id,-1,"semget");
    unsigned short arr[2]={0,10};
    int ret=semctl(sem_id,0,SETALL,arr);//给两个信号量同时赋值
    ERROR_CHECK(ret,-1,"semctl");
    //0号信号量代表产品，1号信号量代表空位
    if(!fork())//消费者进程
    {
        struct sembuf sopp,sopv;
        sopp.sem_num=0;
        sopp.sem_op=-1;//P产品
        sopp.sem_flg=0;
        sopv.sem_num=1;
        sopv.sem_op=1;//V空位
        sopv.sem_flg=0;
        while(1)
        {
            printf("我是消费者 产品数目=%d 空位数目=%d\n",semctl(sem_id,0,GETVAL),semctl(sem_id,1,GETVAL));
            semop(sem_id,&sopp,1);
            printf("正在消费\n");
            semop(sem_id,&sopv,1);
            printf("我是消费者 产品数目=%d 空位数目=%d\n",semctl(sem_id,0,GETVAL),semctl(sem_id,1,GETVAL));
            sleep(2);
        }
    }
    else{//生产者模型
        struct sembuf sopp,sopv;
        sopp.sem_num=1;
        sopp.sem_op=-1;//P空位
        sopp.sem_flg=0;
        sopv.sem_num=0;
        sopv.sem_op=1;//V产品
        sopv.sem_flg=0;
        while(1)
        {
            printf("我是生产者 产品数目=%d 空位数目=%d\n",semctl(sem_id,0,GETVAL),semctl(sem_id,1,GETVAL));
            semop(sem_id,&sopp,1);
            printf("正在生产\n");
            semop(sem_id,&sopv,1);
            printf("我是生产者 产品数目=%d 空位数目=%d\n",semctl(sem_id,0,GETVAL),semctl(sem_id,1,GETVAL));
            sleep(1);
        }
    }
    return 0;
}